/**
******************************************************************************************
* @file observer.h
* @brief Design pattern Observer.
* @date 14 avril 2015
* @author Benjamin Lancinot / Ciro S. Costa
*****************************************************************************************/
/* COPYRIGHT ****************************************************************************
*****************************************************************************************
* Written By Ciro S. Costa /Adapted by Benjamin Lancinot
*
* The MIT License (MIT)
*
* Copyright (c) <2014>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this
* software and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software, and to permit
* persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
********************************************************************************************/

#ifndef OBSERVER_H
#define OBSERVER_H

/*******************************************************************************************
* INCLUSION
********************************************************************************************/

#include <stdlib.h>
#include <stdio.h>

/*******************************************************************************************
* DEFINES
********************************************************************************************/

#define OK EXIT_SUCCESS
#define KO EXIT_FAILURE
#define MAX_OBSERVERS 20

/*******************************************************************************************
* TYPES
********************************************************************************************/


/**
 * @struct Observer
 */
typedef struct Observer {
	/**
	 * Method for performing garbage collection
	 */
	void (*destroy)(struct Observer *);
	/**
	 * A reference to the concrete OBSERVER
	 */
	void* impl;
	/**
	 * A method that any subject is able to trigger
	 */
	void (*notify)(struct Observer*, int, void *);
	/**
	 * The notify implementation (the actual function that is going to
	 * be triggered)
	 */
	void (*notifyImpl)(void*, int, void*);
} Observer;

/*******************************************************************************************
* FUNCTIONS
********************************************************************************************/

/**
 * @brief Constructor
 * @param impl Pointer to object which are the observer
 * @param notifyImpl Pointer to the function which will be use when a subject need to notify this observer
 * @return The pointer to the new Observer
 **/
Observer * observerNew(void*, void (*)(void*, int, void*));

#endif
